package br.com.mybible.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;

public class ExporterCSV {
	
	private static final String ARQUIVO_LIVROS_BIBLICOS = "resources/data/livros.txt";
	
	private static final String PREFIX_ARQUIVO_VERSOS_BIBLICOS = "resources/livros/";
	
	private static final String PREFIX_ARQUIVO_EXPORTADOS_VERSOS_BIBLICOS = "resources/csv/";
	
	private static ExporterCSV instance = null;
	
	private ExporterCSV() { }

	public static ExporterCSV getInstance() {
    	if (instance == null) { 
    		instance = new ExporterCSV();
    	}
        return instance;
	}
	
	public void carregarBiblia() {
		carregarLivros();
	}
	
	private void carregarLivros() {
		Map<String, String> mapaLivros = getMapaLivros();
		
		String livro = null;
		String testamento = null;
		for (String idLivro : mapaLivros.keySet()) {
			livro = mapaLivros.get(idLivro);
			testamento = idLivro.contains("O") ? "Velho Testamento" : "Novo Testamento"; 
			carregarVersos(idLivro, livro, testamento);
		}
	}
	
	private void carregarVersos(String idLivro, String livro, String testamento) {
		String arquivo = PREFIX_ARQUIVO_VERSOS_BIBLICOS + idLivro + ".txt";
		String arquivoCSV = PREFIX_ARQUIVO_EXPORTADOS_VERSOS_BIBLICOS + idLivro + ".csv";
		
		try {
			
			// variaveis para leitura do arquivo
			FileInputStream fis = new FileInputStream(arquivo);
			InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-1");
			BufferedReader in = new BufferedReader(isr);
			String linha = in.readLine();
			
			// variaveis para impressao do arquivo
			FileOutputStream fos = new FileOutputStream(arquivoCSV);
			OutputStreamWriter osw = new OutputStreamWriter(fos, "ISO-8859-1");
			BufferedWriter out = new BufferedWriter(osw);

			// variaveis para manipulacao do conteudo
			String[] dadosLinha = null;
			String numCapitulo = "";
			String numVerso = null;
			String texto = null;
			String textoFormatadoCSV = null;
			
			// processamento
			while (linha != null) {
				
				// recupera dados da linha
				dadosLinha = linha.split("#");
				numCapitulo = dadosLinha[1];
				numVerso = dadosLinha[2];
				texto = dadosLinha[3];
				
				textoFormatadoCSV = "\"" + texto.replaceAll("\"", "\"\"") + "\"";

				// imprime
				out.append(testamento);
				out.append(",");
				out.append(livro);
				out.append(",");
				out.append(numCapitulo);
				out.append(",");
				out.append(numVerso);
				out.append(",");
				out.append(textoFormatadoCSV);
				out.newLine();
				
				// atualiza a linha
				linha = in.readLine();
			}
			
			// fechamento dos recursos
			in.close();
			out.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private Map<String, String> getMapaLivros() {
		Map<String, String> mapaLivros = new HashMap<String, String>();

		try {
			// variaveis para leitura do arquivo
			FileInputStream fis = new FileInputStream(ARQUIVO_LIVROS_BIBLICOS);
			InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-1");
			BufferedReader in = new BufferedReader(isr);
			String livroDaVez = in.readLine();
			
			// variaveis para manipulacao do conteudo
			String[] dadosLinha = null;
			String idLivro = null;
			String nomeLivro = null;
			
			// processamento
			while (livroDaVez != null) {
				dadosLinha = livroDaVez.split("\\t");
				idLivro = dadosLinha[0];
				nomeLivro = dadosLinha[1];
				mapaLivros.put(idLivro, nomeLivro);
				livroDaVez = in.readLine();
			}
			
			// fechamento dos recursos
			in.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return mapaLivros;
	}
	
	public static void main(String[] args) {
		ExporterCSV.getInstance().carregarBiblia();
	}

}
